home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / VOXRAY.ZIP / FIXED.H < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-09  |  5.1 KB  |  186 lines

  1. #ifndef _MYFIXED_                               
  2. #define _MYFIXED_
  3. #include "types.h"
  4.  
  5. typedef LONG MYFIXED;
  6.  
  7. const MYFIXED_ONE=16384;
  8. const MAXMYFIXED=0x7FFFFFFF;
  9. const MYFIXEDSHIFT = 14;
  10. const MYFIXEDCONV = 1 << MYFIXEDSHIFT;
  11.  
  12. extern long high_32, low_32;
  13.                         
  14. MYFIXED fixedmult(MYFIXED op1, MYFIXED op2);
  15. MYFIXED fixeddiv(MYFIXED op1, MYFIXED op2);
  16. MYFIXED fixedsqr(MYFIXED op1);
  17. MYFIXED fixedsqrt(MYFIXED op1);
  18. MYFIXED fixedmd(MYFIXED mul1, MYFIXED mul2, MYFIXED div1);
  19. MYFIXED fixedsqrtLP(MYFIXED n);  // Low  Precision (8.8)
  20. MYFIXED fixedsqrtHP(MYFIXED n);  // High Precision (8.16)
  21.  
  22. void fixedmult64(MYFIXED op1, MYFIXED op2);
  23. void fixedma64(MYFIXED op1, MYFIXED op2);
  24. MYFIXED fixeddiv64(MYFIXED divisor);
  25. MYFIXED fixedadd64(MYFIXED op1);
  26. MYFIXED fixedinv20(MYFIXED op1);
  27.  
  28. inline long longsqrtHP(long op1) {
  29.    return fixedsqrtHP(op1) >> 7;
  30. }
  31.  
  32. inline long longsqrtLP(long op1) {
  33.    return fixedsqrtLP(op1) >> 7;
  34. }
  35.  
  36. inline LONG convtoLONG(MYFIXED x)
  37. {
  38.    return x>>MYFIXEDSHIFT;
  39. }
  40.  
  41. inline MYFIXED convtoMYFIXED(LONG x)
  42. {
  43.    return x<<MYFIXEDSHIFT;
  44. }
  45.  
  46. #pragma aux fixedmult = \
  47.    "imul edx" \
  48.    "add eax, 2000h" \
  49.    "adc edx, 0" \
  50.    "shrd eax,edx,14" \
  51.    parm caller [eax] [edx] \
  52.    value [eax] \
  53.    modify [eax edx];
  54.  
  55. #pragma aux fixedmd = \
  56.   "imul edx" \
  57.   "idiv ebx" \
  58.   parm caller [eax] [edx] [ebx] \
  59.   value [eax] \
  60.   modify [eax edx ebx];
  61.  
  62. #pragma aux fixeddiv = \
  63.    "xor eax,eax" \
  64.    "shrd eax,edx,18" \
  65.    "sar edx, 18" \
  66.    "idiv ecx" \
  67.    parm caller [edx] [ecx] \
  68.    modify [edx ecx eax] \
  69.    value [eax];
  70.  
  71. #pragma aux fixedsqr =   \
  72.     "imul eax"              \
  73.     "add eax, 2000h"        \
  74.     "adc edx, 0"            \
  75.     "shrd eax, edx, 14"     \
  76.     parm caller [eax]       \
  77.     value [eax]             \
  78.     modify [eax edx];
  79.  
  80. #pragma aux fixedmult64= \
  81.     "imul edx"          \
  82.     "mov high_32, edx" \
  83.     "mov low_32, eax" \
  84.     parm caller [eax] [edx] \
  85.     modify [eax edx];
  86.  
  87. #pragma aux fixeddiv64= \
  88.    "mov eax, low_32" \
  89.    "mov edx, high_32" \
  90.    "idiv ecx" \
  91.    parm caller [ecx] \
  92.    modify [eax edx ecx] \
  93.    value [eax];
  94.  
  95. #pragma aux fixedma64= \
  96.   "imul edx"                    \
  97.   "add low_32, eax"         \
  98.   "adc high_32, edx"        \
  99.   parm caller [eax] [edx] \
  100.   modify [eax edx];
  101.  
  102. #pragma aux fixedadd64= \
  103.   "xor eax, eax" \
  104.   "shrd eax, edx, 18" \
  105.   "sar edx, 18" \
  106.   "add low_32, eax" \
  107.   "adc high_32, edx" \
  108.   parm caller [edx] \
  109.   modify [eax edx];
  110.  
  111. #pragma aux fixedinv20= \
  112.   "xor eax, eax" \
  113.   "mov edx, 4h" \
  114.   "idiv ebx" \
  115.   parm caller [ebx] \
  116.   value [eax] \
  117.   modify [eax ebx edx];
  118.  
  119. #pragma aux fixedsqrtLP =            \
  120.     "         xor eax, eax"          \
  121.     "         mov ebx, 40000000h"    \
  122.     "sqrtLP1: mov edx, ecx"          \
  123.     "         sub edx, ebx"          \
  124.     "         jl  sqrtLP2"           \
  125.     "         sub edx, eax"          \
  126.     "         jl  sqrtLP2"           \
  127.     "         mov ecx,edx"           \
  128.     "         shr eax, 1"            \
  129.     "         or  eax, ebx"          \
  130.     "         shr ebx, 2"            \
  131.     "         jnz sqrtLP1"           \
  132.     "         shl eax, 7"            \
  133.     "         jmp sqrtLP3"           \
  134.     "sqrtLP2: shr eax, 1"            \
  135.     "         shr ebx, 2"            \
  136.     "         jnz sqrtLP1"           \
  137.     "         shl eax, 7"            \
  138.     "sqrtLP3: nop"                   \
  139.     parm caller [ecx]                \
  140.     value [eax]                      \
  141.     modify [eax ebx ecx edx];
  142.  
  143.  
  144. #pragma aux fixedsqrtHP =            \
  145.     "         xor eax, eax"          \
  146.     "         mov ebx, 40000000h"    \
  147.     "sqrtHP1: mov edx, ecx"          \
  148.     "         sub edx, ebx"          \
  149.     "         jb  sqrtHP2"           \
  150.     "         sub edx, eax"          \
  151.     "         jb  sqrtHP2"           \
  152.     "         mov ecx,edx"           \
  153.     "         shr eax, 1"            \
  154.     "         or  eax, ebx"          \
  155.     "         shr ebx, 2"            \
  156.     "         jnz sqrtHP1"           \
  157.     "         jz  sqrtHP5"           \
  158.     "sqrtHP2: shr eax, 1"            \
  159.     "         shr ebx, 2"            \
  160.     "         jnz sqrtHP1"           \
  161.     "sqrtHP5: mov ebx, 00004000h"    \
  162.     "         shl eax, 16"           \
  163.     "         shl ecx, 16"           \
  164.     "sqrtHP3: mov edx, ecx"          \
  165.     "         sub edx, ebx"          \
  166.     "         jb  sqrtHP4"           \
  167.     "         sub edx, eax"          \
  168.     "         jb  sqrtHP4"           \
  169.     "         mov ecx, edx"          \
  170.     "         shr eax, 1"            \
  171.     "         or  eax, ebx"          \
  172.     "         shr ebx, 2"            \
  173.     "         jnz sqrtHP3"           \
  174.     "         shr eax, 1"            \
  175.     "         jmp sqrtHP6"           \
  176.     "sqrtHP4: shr eax, 1"            \
  177.     "         shr ebx, 2"            \
  178.     "         jnz sqrtHP3"           \
  179.     "         shr eax, 1"             \
  180.     "sqrtHP6: nop"                   \
  181.     parm caller [ecx]                \
  182.     value [eax]                      \
  183.     modify [eax ebx ecx edx];
  184.  
  185. #endif
  186.